<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Общий предок всех контроллеров, использующий лайауты
 *
 * @package CoreFramework
 * @version 1.0
 * @author Gennadiy Kozlenko
 */
class Main extends Controller {

   /**
    * Максмальное количество ключевых слов
    *
    */
   const MAX_KEYWORDS = 10;

   /**
    * Лайаут
    *
    * @access private
    * @var string
    */
   var $_layout = 'default';

   /**
    * Заголовок страницы
    *
    * @access private
    * @var string
    */
   var $_title = '';

   /**
    * Описание страницы
    *
    * @var string
    */
   var $_description = '';

   /**
    * Ключевые слова странцы
    *
    * @var array
    */
   var $_keywords = array();

   /**
    * Сообщение в виде HTML кода
    *
    * @access private
    * @var string
    */
   var $_message = '';

   /**
    * Контент страницы
    *
    * @access private
    * @var string
    */
   var $_content = '';

   /**
    * Дополнительные параметры для парсера
    *
    * @access private
    * @var string
    */
   var $_params = array();

   /**
    * Конструктор класса
    *
    * @access public
    * @return Main
    */
   function Main() {
      parent::Controller();
      // Подгружаем дополнительные либы
      $this->load->database();
      $this->load->library('db_registry');
      $this->load->library('variables');
      // Подключаем firephp
      $this->load->config('fireignition');
      if (floor(phpversion()) < 5) {
         log_message('error', 'PHP 5 is required to run fireignition');
      } else {
         $this->load->library('firephp');
         $this->firephp->setEnabled($this->config->item('fireignition_enabled'));
      }
      // Устанавливаем metatdata
      $this->set_metadata($this->get_controller());
   } // end Main

   /**
    * Установка лайаута
    *
    * @access public
    * @param string $layout
    */
   function set_layout($layout) {
      $this->_layout = $layout;
   } // end set_layout

   /**
    * Получение лайаута
    *
    * @access public
    * @return string
    */
   function get_layout() {
      return $this->_layout;
   } // end get_layout

   /**
    * Установка заголовка страницы
    *
    * @access public
    * @param string $title
    */
   function set_title($title) {
      $this->_title = $title;
   } // end set_title

   /**
    * Ролучение заголовка страницы
    *
    * @access public
    * @return string
    */
   function get_title() {
      return $this->_title;
   } // end get_title

   /**
    * Установка описания страницы
    *
    * @access public
    * @param string $description
    */
   function set_description($description) {
      $this->_description = $description;
   } // end set_description

   /**
    * Ролучение описания страницы
    *
    * @access public
    * @return string
    */
   function get_description() {
      return $this->_description;
   } // end get_description

   /**
    * Установка сообщения
    *
    * @access public
    * @param string $message Сообщение
    * @param string $type    Тип сообщения
    * @param boolean $store  Сохранять ли в сессии?
    */
   function set_message($message, $type = 'info', $store = false) {
      $data = array(
              'message' => $message,
              'type'    => $type,
      );
      $this->_message = $this->parser->parse('common/message.html', $data, true);
      if ($store) {
         $this->session->set('message', $this->_message);
      }
   } // end set_message

   /**
    * Получение сообщения в виде HTML кода
    *
    * @access public
    * @return string
    */
   function get_message() {
      if ($this->session->exists('message')) {
         $this->_message = $this->session->get('message');
         $this->session->clean('message');
      }
      return $this->_message;
   } // end get_message

   /**
    * Установка контента
    *
    * @access public
    * @param string $content
    */
   function set_content($content) {
      $this->_content = $content;
   } // end set_content

   /**
    * Получение контента
    *
    * @access public
    * @return string
    */
   function get_content() {
      return $this->_content;
   } // end get_content

   /**
    * Добавления параметра для парсера
    *
    * @access public
    * @param string $name
    * @param mixed $value
    */
   function add_param($name, $value) {
      $this->_params[$name] = $value;
   } // end add_param

   /**
    * Очистка параметров для парсера
    *
    * @access public
    */
   function clean_params() {
      $this->_params = array();
   } // end clean_params

   /**
    * Получение параметров для парсера
    *
    * @access public
    * @return array
    */
   function get_params() {
      return $this->_params;
   } // end get_params

   /**
    * Добавление ключевого слова
    *
    * @access public
    * @param string $keyword
    */
   function add_keyword($keyword) {
      array_push($this->_keywords, $keyword);
   } // end add_keyword

   /**
    * Установка ключевых слов
    *
    * @param mixed $keywords
    */
   function set_keywords($keywords) {
      $array = array();
      if (!is_array($keywords)) {
         $array = array_filter(preg_split('~\s*,\s*~msi', $keywords));
      } else {
         $array = $keywords;
      }
      foreach ($array as $keyword) {
         $this->add_keyword($keyword);
      }
   } // end set_keywords

   /**
    * Очистка ключевых слов
    *
    * @access public
    */
   function clean_keywords() {
      $this->_keywords = array();
   } // end clean_keywords

   /**
    * Получение ключевых слов
    *
    * @access public
    * @return array
    */
   function get_keywords() {
      return $this->_keywords;
   } // end get_keywords

   /**
    * Установка параметров для парсера
    *
    * @access public
    * @param array $params
    */
   function set_params($params) {
      $this->_params = $params;
   } // end set_params

   /**
    * Вывод контента в браузер
    *
    * @access public
    */
   function display() {
      $this->benchmark->mark('display_start');
      $data = array(
              'page_content'     => $this->get_content(),
              'page_message'     => $this->get_message(),
              'page_title'       => $this->get_title(),
              'page_top_title'   => $this->_build_title(),
              'page_description' => addslashes($this->get_description()),
              'site_name'        => $this->variables->get('site_name'),
              'site_slogan'      => $this->variables->get('site_slogan')
      );

      $keywords = array_slice(array_unique($this->get_keywords()), 0, self::MAX_KEYWORDS);
      $data['page_keywords'] = addslashes(implode(',', $keywords));
      // Параметры
      foreach ($this->get_params() as $key => $val) {
         $data[$key] = $val;
      }
      if (!isset($data['title'])) {
         $data['title'] = $this->_title;
      }
      // Обрабатываем ошибки
      $template = $this->parser->parse('common/error.html', array(), true);
      foreach ($this->errors->get_errors() as $key => $val) {
         $data['error_' . $key] = str_replace('{%content%}', $val, $template);
      }
      // Если нужно, выводим дебажную информацию
      if (!in_array($this->get_layout(), array('empty', 'iframe'))) {
         if ('false' == $this->input->get('debug')) {
            $this->session->clean('debug');
         } elseif ('true' == $this->input->get('debug') || false !== $this->session->get('debug')) {
            $this->output->enable_profiler(true);
            $this->session->set('debug', 1);
         }
      }
      $this->parser->parse('layouts/' . $this->get_layout() . '.html', $data);
      // Обработка выходного контента
      $output = $this->output->get_output();
      // Обработка виджетов
      $this->benchmark->mark('process_widgets_start');
      $this->load->helper('widget');
      $output = parse_widgets($output);
      $this->benchmark->mark('process_widgets_end');
      // Базовые параметры
      // TODO: Нужно реализовать получение текущего url
      $current_url = '';
      $output = str_replace(array('{%base_url%}', '{%class%}', '{%method%}', '{%current_url%}'),
              array(base_url(), $this->get_controller(), $this->get_method(), $current_url), $output);
      // Удаление лишних тегов
      $output = preg_replace('~{%.*?%}~ms', '', $output);
      // Удаление особых комментариев
      $output = preg_replace('~<!--/\*.*?\*/-->~ms', '', $output);
      $this->benchmark->mark('display_end');
      $this->output->set_output($output);
   } // end display

   /**
    * Редирект на внутреннюю страницу
    *
    * @access public
    * @param string $class
    * @param string $method
    * @param array $params
    */
   function redirect($class = '', $method = '', $params = array()) {
      $this->load->helper('link');
      $url = create_link($class, $method, $params);
      header('Location: ' . $url);
      exit;
   } // end redirect

   /**
    * Редирект на внешнюю страницу
    *
    * @access public
    * @param string $url
    */
   function go($url) {
      header('Location: ' . $url);
      exit;
   } // end go

   /**
    * Возвращает название текущего контроллера
    *
    * @access public
    * @return string
    */
   function get_controller() {
      $router =& load_class('Router');
      return $router->fetch_class();
   } // end get_controller

   /**
    * Возвращает название текущего метода
    *
    * @access public
    * @return string
    */
   function get_method() {
      $router =& load_class('Router');
      return $router->fetch_method();
   } // end get_method

   /**
    * Метод построения title страницы
    *
    * @return string
    */
   function _build_title() {
      $title = str_replace(array('{%page_title%}'), array($this->_title), $this->lang->line('title_template'));
      return $title;
   }

   /**
    * Установка metadata
    *
    * @access public
    * @param string $name
    * @author Obidnov Alexander
    */
   function set_metadata($name, $params = '') {
      if (!$name) {
         return false;
      }
      $this->load->model('m_table');
      $this->m_table->set_table('titles');
      $this->m_table->clean();
      $this->m_table->add_restriction('name', 'default_state');
      $this->m_table->set_limit(1);
      if (!($default = $this->m_table->next_result())) {
         $default['title'] = '';
         $default['description'] = '';
         $default['keywords'] = '';
      }
      $this->m_table->clean();
      $this->m_table->add_restriction('name', urldecode($name));
      $this->m_table->set_limit(1);
      if (($result = $this->m_table->next_result())) {
         if ($result['title']) {
            $this->set_title(sprintf($result['title'], $params));
         } else {
            $this->set_title($default['title']);
         }
         if ($result['description']) {
            $this->set_description($result['description']);
         } else {
            $this->set_description($default['description']);
         }
         if ($result['keywords']) {
            $this->set_keywords($result['keywords']);
         } else {
            $this->set_keywords($default['keywords']);
         }
      } else {

         if (false !== $this->lang->line($this->get_controller() . '_title')) {
            $this->set_title($this->lang->line($this->get_controller() . '_title'));
         } else {
            $this->set_title($default['title']);
            $this->set_keywords($default['keywords']);
         }

         if (false !== $this->lang->line($this->get_controller() . '_description')) {
            $this->set_description($this->lang->line($this->get_controller() . '_description'));
         } else {
            $this->set_description($default['description']);
         }

      }
      return true;
   } // end set_metadata

}
